/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.upc.clase.demo.dao.impl;

import edu.upc.clase.demo.dao.ClienteDao;
import edu.upc.clase.demo.entity.Cliente;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author joelpacheco
 */
@Repository
public class ClienteDaoImpl extends SimpleJdbcDaoSupport implements ClienteDao {

    private static Logger log = LoggerFactory.getLogger(ClienteDaoImpl.class);

    @Autowired
    public ClienteDaoImpl(DataSource datasource) {
        log.info("Asignando DataSource");
        setDataSource(datasource);

    }

    @Override
    public Integer insertar(Cliente cliente) {
        getJdbcTemplate().update(
                "INSERT INTO Cliente"
                + "("
                + "nombres,"
                + "apellidos,"
                + "DNI,"
                + "telefono,"
                + "celular,"
                + "tipoDireccion,"
                + "nombreEmpresa,"
                + "direccion,"
                + "referencia,"
                + "borrado)"
                + "VALUES( ?, ?,?, ?, ?,?, ?, ?,?, ?)",
                cliente.getNombre(), cliente.getApellidos(), cliente.getDNI(),
                cliente.getTelefono(), cliente.getCelular(), cliente.getTipoDireccion(), cliente.getNombreEmpresa(),
                cliente.getDireccion(), cliente.getReferencia(), cliente.getBorrado());

        return getSimpleJdbcTemplate().queryForInt("select last_insert_id()");
    }

    @Override
    public void actualizar(Cliente cliente) {
        getJdbcTemplate().update("UPDATE Cliente\n"
                + "SET\n"
                + " nombres  = ?,\n"
                + " apellidos  = ?,\n"
                + " DNI  = ?,\n"
                + " telefono  = ?,\n"
                + " celular  = ?,\n"
                + " tipoDireccion  = ?,\n"
                + " nombreEmpresa  = ?,\n"
                + " direccion  = ?,\n"
                + " referencia  = ?,\n"
                + " borrado  = ?\n"
                + " WHERE  clienteId  = ?", cliente.getNombre(), cliente.getApellidos(), cliente.getDNI(),
                cliente.getTelefono(), cliente.getCelular(), cliente.getTipoDireccion(), cliente.getNombreEmpresa(),
                cliente.getDireccion(), cliente.getReferencia(), cliente.getBorrado(), cliente.getClienteId());
    }

    @Override
    public void eliminar(Cliente cliente) {
        getJdbcTemplate().update("DELETE FROM Cliente\n"
                + "WHERE clienteId = ?", cliente.getClienteId());
    }

    @Override
    public List<Cliente> buscarTodos() {
        return getSimpleJdbcTemplate().query(
                "SELECT\n"
                + " clienteId ,\n"
                + " nombres ,\n"
                + " apellidos ,\n"
                + " DNI ,\n"
                + " telefono ,\n"
                + " celular ,\n"
                + " tipoDireccion ,\n"
                + " nombreEmpresa ,\n"
                + " direccion ,\n"
                + " referencia ,\n"
                + " borrado \n"
                + " FROM Cliente",
                new BeanPropertyRowMapper<Cliente>(Cliente.class));
    }

    @Override
    public Cliente buscar(Integer id) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "SELECT\n"
                    + " clienteId ,\n"
                    + " nombres ,\n"
                    + " apellidos ,\n"
                    + " DNI ,\n"
                    + " telefono ,\n"
                    + " celular ,\n"
                    + " tipoDireccion ,\n"
                    + " nombreEmpresa ,\n"
                    + " direccion ,\n"
                    + " referencia ,\n"
                    + " borrado \n"
                    + "FROM Cliente WHERE clienteId = ?",
                    new BeanPropertyRowMapper<Cliente>(Cliente.class), id);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<Cliente> buscarPorNombre(String nombre) {
        try {
            Map<String, String> parametros = new HashMap<String, String>();
            parametros.put("nombre", "%" + nombre + "%");
            return getSimpleJdbcTemplate().query(
                    "select * from Cliente where nombres like :nombre",
                    new BeanPropertyRowMapper<Cliente>(Cliente.class), parametros);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public Cliente buscarPorDni(String dni) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "SELECT\n"
                    + " nombres ,\n"
                    + " apellidos ,\n"
                    + " telefono ,\n"
                    + " celular ,\n"
                    + " tipoDireccion ,\n"
                    + " nombreEmpresa ,\n"
                    + " direccion ,\n"
                    + " referencia ,\n"
                    + " borrado \n"
                    + "FROM Cliente WHERE DNI = ?",
                    new BeanPropertyRowMapper<Cliente>(Cliente.class), dni);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}
